package com.ayu.wxgzh.ayucyy.Controller;

import com.alibaba.fastjson.JSON;
import com.ayu.wxgzh.ayucyy.service.WeChatUserInfoService;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;

import java.io.UnsupportedEncodingException;
import java.nio.charset.StandardCharsets;
import java.util.Base64;
import java.util.Map;

/**
 * @Author 徐林玉
 * @Description WeChatUserInfoController
 * @Date 2023/2/28 11:15
 * @Version 1.0
 */

@Controller
@Slf4j
public class WeChatUserInfoController {


    private final WeChatUserInfoService weChatUserInfoService;

    @Autowired
    public WeChatUserInfoController(WeChatUserInfoService weChatUserInfoService) {
        this.weChatUserInfoService = weChatUserInfoService;
    }

    /**
     * 由后端来进行授权操作（需要在微信页面打开）
     *
     * @param baseUrl 前端页面地址 用于授权完成后，后端重定向到前端页面
     * @param scope   应用授权作用域，此处为了模拟两种情况，进行传值:
     *                snsapi_base （不弹出授权页面，直接跳转，只能获取用户openid）
     *                snsapi_userinfo （弹出授权页面，可通过 openid 拿到昵称、性别、所在地。 即使在未关注的情况下，只要用户授权，也能获取其信息 ）
     * @return
     */
    @GetMapping(value = "/code")
    @ApiOperation(value = "用户请求进行授权及获取信息", notes = "用户请求进行授权及获取信息")
    public String code(@RequestParam("baseUrl") String baseUrl, String scope) throws UnsupportedEncodingException {
        log.info("------ 用户请求进行授权及获取信息 ------");
        //通过code获取用户其信息
        String url = weChatUserInfoService.getAuthCode(baseUrl, scope);
        return "redirect:" + url;
    }


    /**
     * @param code
     * @param state 存放的前端页面地址，授权后回调用
     * @return
     */
    @GetMapping(value = "/auth")
    @ApiOperation(value = "前端根据code获取信息", notes = "前端根据code获取信息")
    public void auth(@RequestParam(value = "code", required = false) String code, @RequestParam(value = "state", required = false) String state) throws UnsupportedEncodingException {
        log.info("------ 回显Code：{} ------", code);
        // 解析回传的 state值
        state = new String(Base64.getDecoder().decode(state.getBytes(StandardCharsets.UTF_8)));
        Map map = JSON.parseObject(state, Map.class);
        String baseUrl = map.get("baseUrl").toString();
        String scope = map.get("scope").toString();

        // 通过code获取用户openid
        weChatUserInfoService.getUserAuth(code, scope);
        // 直接跳转到前端地址

        // TODO: 网页授权要过微信认证，这个方法不行
        // TODO: 2023/2/28 通过给用户设置备注名的方式看行不行
        // TODO: 2023/2/28 用户设置备注名也需要权限认证。。。
        // TODO: 2023/2/28 用同步代码块来做，这样子爬虫爬取第一个表情就行了,不用去找用户名。
    }


}
